/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.persistance.utils;

import java.util.List;
import javax.persistence.PersistenceException;
import net.etrs.formathlon.entity.utils.IdentifiableEntity;


/**
 * Une façade accèdera aux entities. 
 * Par défaut une façade permettra toutes les opérations CRUD et quelques opérations comme
 * l'obtention d'une nouvelle instance du type paramétré ou l'obtention de la classe du type
 * paramétré.
 * 
 * Cette interface prend n'importe quel type tant qu'elle implémente IdentifiableEntity.
 * 
 * @author OPIF
 * @param <T> entité persistante, gérée par JPA
 */
public interface Facade<T extends IdentifiableEntity>
{
    /**
     * crée une nouvelle instance de <T>.
     * @return La nouvelle instance
     */
    T newInstance();
    
    /**
     * renvoie la classe du type paramétré de la classe.
     * @return La classe buisness
     */
    Class getBusinessClass();
    
    /**
     * ajoute une nouvelle entity au contexte JPA (persist).
     * 
     * @param t 
     */
    void create(T t) throws PersistenceException;     

    /**
     * lit une instance de T dont l'ID est passé en paramètre (find).
     * 
     * @param id L'id demandé
     * @return T
     */
    T read(Long id) throws PersistenceException;

    /**
     * récupère toutes les instances de T.
     * @return La liste de T
     */
    List<T> readAll() throws PersistenceException;

    /**
     * Mets à jour les données portée par l'instance de T (merge).
     * @param t 
     */
    void update(T t) throws PersistenceException;
    
    /**
     * Supprime l'instance de T.
     * @param t 
     */
    void delete(T t) throws PersistenceException;
    
    /**
     * Archiver l'instance de T.
     * @param t 
     */
    void archiver(T t) throws PersistenceException;
}
